【AWS SSMステートマネージャー】複数のEC2インスタンス(Linux)に対するプロセスチェック
全インスタンスに特定アプリケーション(例えばエンドポイントセキュリティ) がインストールされていて、 かつ「稼働もしている」ことを棚卸ししたいケースがあると思います。
今回は特定アプリケーションが「稼働している」ことを棚卸しする一手段を紹介します。 Systems Manager(SSM) ステートマネージャーを使います。
※1: 「インストールされている」ことは Configルールを使って簡単に実現できます。 (参考: DevelopersIO)
※2: プロセスダウンをすぐに検知しないといけない、といったリアルタイム性が求められる場合は CloudWatch Agent や他 Third Party の「ちゃんとしたプロセス監視」を実装しましょう。
前提条件
EC2インスタンスが SSM管理下であることが前提条件です。
SSM管理下にする方法については以下ブログが参考になります。
また、「そもそもSSM管理下かどうか」は ConfigルールやSecurity Hubで検知できます。
- Security Hub: [SSM.1] EC2 instances should be managed by AWS Systems Manager
- Config Rule: ec2-instance-managed-by-systems-manager
作ってみる
今回は全インスタンスに CloudWatch Agent ( amazon-cloudwatch-agent
) が稼働しているか、 定期的にチェックする環境を作ってみます。
Systems Manager のステートマネージャーページに移動します。 [関連付けの作成] を選択します。
「名前」を適当に記載します。今回は process-check-amazon-cloudwatch-agent
としました。
「ドキュメント」部分は AWS-RunShellScript を選択します。 これはパラメータに指定したコマンドをEC2インスタンス上で実行できるドキュメントです。
「パラメータのCommands」には 以下の ps コマンド ( ps -C ${プロセス名}
)を指定します。
このコマンドで、実行ファイル名を指定してプロセス情報を表示します。 もし起動していなかったときは、このコマンドは異常終了扱いになります。以下挙動の例です。
$ ps -C amazon-cloudwatch-agent # PID TTY TIME CMD # 2643 ? 00:00:40 amazon-cloudwat $ echo $? # 0 (= 成功) $ sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -m ec2 -a stop $ ps -C amazon-cloudwatch-agent # PID TTY TIME CMD $ echo $? # 1 (= 失敗)
次に「ターゲット」です。今回は すべてのインスタンスを選択 とします。 (必要に応じてターゲットの範囲を変えてください。タグ指定なども可能です)
「スケジュール」は デフォルト(30分ごとの実行)、cron間隔のみの実行 とします。 (ここも好みに合わせて変更して下さい)
他の項目は特に変えずに、作成します。
以上でプロセス棚卸し環境の作成は完了です。
確認する
できたステートマネージャの関連付けリソースはこんな感じです。
しばらく待つと関連付けが実行されました。 [リソース] タブを見ると成功したインスタンス、失敗したインスタンスが確認できます。
成功したインスタンスは ps -C ${プロセス名}
が正常終了したもの、つまりプロセスが稼働していることを示しています。 失敗したインスタンスは ps -C ${プロセス名}
が異常終了したもの、つまりプロセスがダウンしていることを示しています。
以上、確認でした。こんな感じで、簡易なプロセス棚卸し環境を作れます。SSM、便利。
カスタマイズ
EventBridge連携
EventBridgeを使って通知の仕組みを作成できます。 以下にフィルタ例を記載します。チェックに失敗したイベントを拾うものです。 (適宜 association-name
値を変えてください)
{ "source": ["aws.ssm"], "detail-type": ["EC2 State Manager Association State Change"], "detail": { "association-name": ["process-check-amazon-cloudwatch-agent"], "status": ["Failed"] } }
▼ 参考: 失敗したイベントのJSONサンプル
{ "version": "0", "id": "15f581f9-f5ad-1768-dc0f-3c55b0267937", "detail-type": "EC2 State Manager Association State Change", "source": "aws.ssm", "account": "123456789012", "time": "2022-11-16T07:00:22Z", "region": "ap-northeast-1", "resources": [ "arn:aws:ssm:ap-northeast-1::document/AWS-RunShellScript" ], "detail": { "association-id": "57b54c20-aa8d-4a69-805d-3ba24c1e84a1", "association-name": "process-check-amazon-cloudwatch-agent", "document-name": "AWS-RunShellScript", "association-version": "1", "document-version": "Optional.empty", "targets": "[{\"key\":\"InstanceIds\",\"values\":[\"*\"]}]", "creation-date": "2022-11-16T06:43:53.635736Z", "last-execution-date": "2022-11-16T07:00:19.417Z", "last-updated-date": "2022-11-16T06:43:53.635736Z", "status": "Failed", "detailed-status": "Failed", "association-status-aggregated-count": "{\"Failed\":1,\"Success\":1}", "schedule-expression": "cron(0 */30 * * * ? *)", "association-cwe-version": "1.0" } }
おわりに
「ゆるいプロセス監視」の実装例でした。 SSM管理下であればサクッと作成できるので便利だと思います。